class Vacacion < ActiveRecord::Base
  belongs_to :usuario
  validates_presence_of :desde,:hasta

  named_scope :por_anio, lambda{|ini,fin|{:conditions => ['(desde BETWEEN ? AND ?) OR (hasta BETWEEN ? AND ?)',ini,fin,ini,fin]}}
  named_scope :en_periodo, lambda{|ini,fin|{:conditions => ['(? BETWEEN desde AND hasta) OR (? BETWEEN desde AND hasta) OR (desde BETWEEN ? AND ?) OR (hasta BETWEEN ? AND ?)',ini,fin,ini,fin,ini,fin]}}

  #Calcula la cantidad de dias disponibles en el periodo laboral que se pasa como parametro pini..pfin
  def cantidad_dias
#    logger.info "\n\n=============================================================="
#    logger.info "dias_no_considerados"
#    logger.info "#{dias_no_considerados})"
#    logger.info "==============================================================\n\n"
    total_dias-dias_no_considerados
  end

  def dias_no_considerados
    cantidad_feriados=feriados.count
    cantidad_sabados=sabados.count
    cantidad_domingos=0
    feriados.each do |f|
      domingos.each do |domingo|
        feriado= f.year ? Date.new(f.year,f.month,f.day) : Date.new(domingo.year,f.month,f.day)
#        logger.info "\n\n=============================================================="
#        logger.info "feriado==domingo => #{feriado}==#{domingo} #{feriado==domingo}"
#        logger.info "==============================================================\n\n"
        cantidad_domingos+=1 unless feriado==domingo
      end        
    end
#    logger.info "\n\n=============================================================="
#    logger.info "dias_no_considerados"
#    logger.info "cantidad_domingos -#{cantidad_domingos}"
#    logger.info "cantidad_sabados - #{cantidad_sabados}"
#    logger.info "cantidad_feriados - #{cantidad_feriados}"
#    logger.info "==============================================================\n\n"    
    cantidad_domingos+cantidad_sabados+cantidad_feriados
  end
  
  def total_dias
    (hasta-desde).round
  end
  
  def domingos
    dias=[]
    desde.upto(hasta){|f| dias<<f if f.cwday==7}    
    dias
  end
  
  def feriados
    Feriado.find_all_by_periodo(desde,hasta,self.usuario.sucursal_id)
  end

  def sabados
    dias=[]
    dias_habiles=[]
    plan_horario=self.usuario.planes_horarios.para_vacacion(self).first
    if plan_horario
      trabaja_sabado=eval(plan_horario.horarios.map(&:sabado).join(' or '))
      if trabaja_sabado
        desde.upto(hasta){|f| dias<<f if f.cwday==6  }
        feriados.each do |f|
          dias.each do |sabado|
            feriado= f.year ? Date.new(f.year,f.month,f.day) : Date.new(sabado.year,f.month,f.day)
            dias_habiles<<sabado unless feriado==sabado
          end        
        end
      end      
    end
    dias_habiles
  end
  def cantidad_dias_libres
    #usuario.dias_libres
    0
  end
  #Calcula los limites en un periodo de trabajo, para el calculo de cantidad de
  #dias de vacaciones usados en dicho periodo, es utilizado en los casos en los
  #que el inicio de la vacacion (iv), cae en un periodo laboral (p1i..p1f), y
  #el final de la vacacion (fv), cae en el periodo siguiente (p2i..p2f),
  #Ej: teniendo p1i..p1f, p2i..p2f, iv..fv, ordenando dichas fechas se tendria
  #p1, iv p1f, p2i,fv, p2f, entonces los dias de vacacion correspondientes a p1
  #usados en p1 se calcula p1f-iv y los dias de vacacion del p1 utilizados en p2 vf-p2i
  def get_limites_periodo(pini,pfin)
    inicio,fin=desde,hasta
    if (pini and pfin)
      inicio,fin=desde,pfin  if (pini<desde and desde<pfin) and !(pini<hasta and hasta<pfin)
      inicio,fin=pini,hasta  if (pini<hasta and hasta<pfin) and !(pini<desde and desde<pfin)
    end
    [inicio,fin]
  end
end
